#include <iostream>
#include <cassert>
#include <cstring>
#include <unistd.h>
#include <csignal>

using namespace std;

void show(const sigset_t set){
    cout << "block bitmap: ";
    for ( int signo = 1; signo <= 31; signo++){
        if(sigismember(&set, signo))
            cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}

void printPending(const sigset_t pending){
    cout << "pending bitmap: ";
    for(int signo = 1; signo <= 31; ++signo){
        if(sigismember(&pending, signo))
            cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}

static void handler(int signo)
{
    cout << "对特定信号："<< signo << "执行捕捉动作" << endl;
    //sleep(5);
    int cnt = 15;
    while(cnt)
    {
        cnt--;

        sigset_t pending;
        sigemptyset(&pending); // 不是必须的
        sigpending(&pending);
        printPending(pending);
        sleep(1);
    }
}

int main(){
    // signal(2, handler);
    // int cnt = 0;
    // sigset_t set, oset;
    // sigemptyset(&set);
    // sigemptyset(&oset);

    // sigaddset(&set, 2);

    // sigprocmask(SIG_BLOCK, &set, &oset);

    // while(true){
    //     sigset_t pending;
    //     sigemptyset(&pending);
    //     int n = sigpending(&pending);
    //     assert(n == 0);
    //     (void)n;

    //     show(set);
    //     printPending(pending);

    //     sleep(1);
        
    //     if(cnt++ == 10){
    //         cout << "receive block" << endl;
    //         sigprocmask(SIG_SETMASK, &oset, nullptr);
    //     }
    // }

    struct sigaction act, oact;
    memset(&act, 0, sizeof(act));
    memset(&oact, 0, sizeof(oact));
    act.sa_flags = 0;
    act.sa_handler = handler;
    sigemptyset(&act.sa_mask);
    sigaction(2, &act, &oact);

    while(true){
        sleep(1);
    }


    return 0;
}